小编典典

透明状态栏 - Android 4.4 (KitKat) 之前

all

我知道在Android 4.4 KitKat (API 19) 中可以使状态栏透明。

但是例如,Go Launcher Ex 和其他人可以选择使其透明,并且它也适用于 KitKat 之前的版本,对我来说也是(Android 4.3(Jelly Bean)),也适用于我的 Android 4.0(冰淇淋三明治)设备。

我不需要 root 或任何特殊权限来使用它。

下载 Go Launcher Ex 并亲自尝试。对我来说,如果我需要 root 也可以。

但他们是怎么做到的?如何使 Android 的状态栏在 KitKat 之前的设备上半透明?

*—澄清事情—*

我不是在谈论Action Bar;我的意思是状态栏(通知栏)!


请参阅这些示例图片:

(注意,这取自我的带有Android 4.3*和**Go Launcher Ex的Stock Galaxy Note 3。*)

(同样的事情也适用于我的Galaxy S2Android 4.0。)

没有透明状态栏:

无透明条(默认)

启用透明状态栏:(我想在 4.4(API 19)之前的设备上实现这一点

带有透明状态栏(我想在 4.4 之前的设备上以任何方式实现


阅读 183

收藏
2022-05-27

共1个答案

小编典典

我发现了如何
在至少运行 Android 4.0 的三星和索尼设备上获得透明状态栏。

首先,让我解释一下为什么它在大多数设备上是不可能的:
从 Android 的官方方面来看,直到 KitKat (4.4) 才有解决方案。
但三星和索尼等一些设备制造商已在其专有软件中添加了此选项。

三星使用他们自己的皮肤版本的 Android,称为 TouchWiz,索尼也在使用他们自己的系统。
他们有一个自己的View类实现,带有额外的SYSTEM_UI_标志,允许在 4.4 之前的设备上启用透明状态栏!

但是证明这些标志存在并访问它们的唯一方法是使用反射。
这是我的解决方案:


解决视图标志:

int ResolveTransparentStatusBarFlag()
{
    String[] libs = getPackageManager().getSystemSharedLibraryNames();
    String reflect = null;

    if (libs == null)
        return 0;

    for (String lib : libs)
    {
        if (lib.equals("touchwiz"))
            reflect = "SYSTEM_UI_FLAG_TRANSPARENT_BACKGROUND";
        else if (lib.startsWith("com.sonyericsson.navigationbar"))
            reflect = "SYSTEM_UI_FLAG_TRANSPARENT";
    }

    if (reflect == null)
        return 0;

    try
    {
        Field field = View.class.getField(reflect);
        if (field.getType() == Integer.TYPE)
            return field.getInt(null);
    }
    catch (Exception e)
    {
    }

    return 0;
}

将其应用于decorView您的Window(在任何活动中):

void ApplyTransparentStatusBar()
{
    Window window = getWindow();
    if (window != null)
    {
        View decor = window.getDecorView();
        if (decor != null)
            decor.setSystemUiVisibility(ResolveTransparentStatusBarFlag());
    }
}

我认为可能有其他设备制造商已经实施了这样的标志
,但我只能弄清楚这两个(因为我拥有三星和索尼设备)

2022-05-27